package com.pdweb.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.pdweb.vo.Registros;

public class RegistrosDao extends DBconnection{
	
	private Connection conn;

	public RegistrosDao() throws ClassNotFoundException, SQLException {
		this.conn = getConnection();
	}

	public RegistrosDao(Connection conn) {
		this.conn = conn;
	}

	public void adicionaRegistro(Registros registros) throws SQLException {

		PreparedStatement st = null;

		try {
			st = conn
					.prepareStatement("insert into Registros(ID_REGISTRO, TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG, FUNCIONARIO_id_funcionario_func, DT_HORARIO_REG, DT_DIA_REG) value(?,?,?,?,?);");
					
			st.setInt(1, registros.getIdRegistro());
			st.setInt(2, registros.getIdTipoRegistro());
			st.setInt(3, registros.getIdFuncionario());
			st.setString(4, registros.getHora());
			st.setString(5, registros.getData());
			
			st.execute();
		} finally {
			st.close();
		}
	}

	public List<Registros> obterRegistros() throws SQLException {

		List<Registros> Registros = new ArrayList<Registros>();

		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			rs = st.executeQuery("select id_registro, TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG, FUNCIONARIO_id_funcionario_func, tipo_registro.st_nome_treg, funcionarios.st_nome_func, dt_horario_reg, dt_dia_reg from registros inner join tipo_registro on(registros.TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG = tipo_registro.id_tipo_registro_treg) inner join funcionarios on (registros.FUNCIONARIO_id_funcionario_func = funcionarios.id_funcionario_func) ");
			while (rs.next()) {
				Registros result = new Registros();
				result.setIdRegistro(rs.getInt("ID_REGISTRO"));
				result.setIdTipoRegistro(rs.getInt("TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG"));
				result.setData(rs.getString("DT_DIA_REG"));
				result.setHora(rs.getString("DT_HORARIO_REG"));
				result.setIdFuncionario(rs.getInt("FUNCIONARIO_id_funcionario_func"));
				result.setNomeTipoRegisto(rs.getString("tipo_registro.st_nome_treg"));
				result.setNomeFuncionario(rs.getString("funcionarios.st_nome_func"));

				Registros.add(result);
			}
		} finally {
			st.close();
			rs.close();
		}
		return Registros;
	}

	public void excluirRegistro(Registros registros) throws SQLException {

		PreparedStatement st = null;

		try {
			st = conn
					.prepareStatement("delete from Registros where ID_REGISTRO = ?;");

			st.setInt(1, registros.getIdRegistro());
			st.execute();
		} finally {
			st.close();
		}
	}

	public Registros obterRegistro(Registros registros) throws SQLException {
		Registros retorno = null;
		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			
			//String sql = "select * from Registros where ID_REGISTRO = "+ registros.getIdRegistro();
			String sql = "select id_registro, TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG, FUNCIONARIO_id_funcionario_func, tipo_registro.st_nome_treg, funcionarios.st_nome_func, dt_horario_reg, dt_dia_reg from registros inner join tipo_registro on(registros.TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG = tipo_registro.id_tipo_registro_treg) inner join funcionarios on (registros.FUNCIONARIO_id_funcionario_func = funcionarios.id_funcionario_func) where funcionario_id_funcionario_func = "+registros.getIdFuncionario() ;

			rs = st.executeQuery(sql);

			if (rs.next()) {
				retorno = new Registros();

				retorno.setIdRegistro(rs.getInt("ID_REGISTRO"));
				retorno.setIdTipoRegistro(rs.getInt("TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG"));
				retorno.setData(rs.getString("DT_DIA_REG"));
				retorno.setHora(rs.getString("DT_HORARIO_REG"));
				retorno.setIdFuncionario(rs.getInt("FUNCIONARIO_id_funcionario_func"));
				retorno.setNomeTipoRegisto(rs.getString("tipo_registro.st_nome_treg"));
				retorno.setNomeFuncionario(rs.getString("funcionarios.st_nome_func"));
			}
			return retorno;
		} finally {
			st.close();
			rs.close();
		}
	}
	
	public void atualizaRegistro(Registros registros) throws SQLException{
		
		PreparedStatement st = null;
		try {
			st = conn
					.prepareStatement("UPDATE Registros SET ID_REGISTRO = ?, TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG = ?, FUNCIONARIO_id_funcionario_func = ?, DT_HORARIO_REG = ?, DT_DIA_REG = ? WHERE id_cargo_carg = ?;");
			
			st.setInt(1, registros.getIdRegistro());
			st.setInt(2, registros.getIdTipoRegistro());
			st.setInt(3, registros.getIdFuncionario());
			st.setString(4, registros.getHora());
			st.setString(5, registros.getData());
			
			st.execute();
		} finally {
			st.close();

		}
	}
	
	public Registros obterUltimoRegistro(Registros registros) throws SQLException {
		
		Registros retorno = null;
		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			
			
			
			String sql = "SELECT TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG, DT_DIA_REG,  tipo_registro.st_nome_treg FROM registros inner join tipo_registro on (registros.tipo_registro_id_tipo_registro_treg = tipo_registro.id_tipo_registro_treg ) where FUNCIONARIO_id_funcionario_func = "+registros.getIdFuncionario()+" order by ID_REGISTRO  desc limit 1 ;";
			
			rs = st.executeQuery(sql);

			if (rs.next()) {
				retorno = new Registros();

				
				retorno.setUltimoTipoRegistro(rs.getInt("TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG"));
				retorno.setUltimaData(rs.getString("DT_DIA_REG"));
				retorno.setNomeTipoRegisto(rs.getString("tipo_registro.st_nome_treg"));
				
				
			}
			return retorno;
		} finally {
			st.close();
			rs.close();
		}
	}
	
	public boolean verificaUltimoRegistro(Registros registros) throws SQLException{
		
		
		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			
			String sql = "SELECT TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG, DT_DIA_REG FROM registros  where FUNCIONARIO_id_funcionario_func = "+registros.getIdFuncionario()+" order by ID_REGISTRO  desc limit 1 ;";
			
			rs = st.executeQuery(sql);

			if (!rs.next()) {
				return false;
			} else {
				
			}
			return true;
		} finally {
			st.close();
			rs.close();
		}
	}
		
	public Registros obterNomeUltimoRegistro(int tipoRegistro ) throws SQLException{
			
			Registros retorno = null;
			Statement st = null;
			ResultSet rs = null;
			
			try {
				st = conn.createStatement();
				
				
				
				String sql = "select st_nome_treg from tipo_registro where id_tipo_registro_treg = "+tipoRegistro+ " ; ";
				
				rs = st.executeQuery(sql);

				if (rs.next()) {
					retorno = new Registros();
		
					retorno.setNomeTipoRegisto(rs.getString("st_nome_treg"));

				}
				return retorno;
			} finally {
				st.close();
				rs.close();
			}
		}
	
	public List<Registros> obterRegistrosPerfil(int idFuncionario) throws SQLException {

		List<Registros> Registros = new ArrayList<Registros>();
		
		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			String sql = "select id_registro, TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG, FUNCIONARIO_id_funcionario_func, tipo_registro.st_nome_treg, funcionarios.st_nome_func, dt_horario_reg, dt_dia_reg from registros inner join tipo_registro on(registros.TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG = tipo_registro.id_tipo_registro_treg) inner join funcionarios on (registros.FUNCIONARIO_id_funcionario_func = funcionarios.id_funcionario_func) where funcionario_id_funcionario_func = "+idFuncionario+" order by id_registro desc limit 3;" ;
			rs = st.executeQuery(sql);
			while (rs.next()) {
				Registros result = new Registros();
				result.setIdRegistro(rs.getInt("ID_REGISTRO"));
				result.setIdTipoRegistro(rs.getInt("TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG"));
				result.setData(rs.getString("DT_DIA_REG"));
				result.setHora(rs.getString("DT_HORARIO_REG"));
				result.setIdFuncionario(rs.getInt("FUNCIONARIO_id_funcionario_func"));
				result.setNomeTipoRegisto(rs.getString("tipo_registro.st_nome_treg"));
				result.setNomeFuncionario(rs.getString("funcionarios.st_nome_func"));

				Registros.add(result);
			}
		} finally {
			st.close();
			rs.close();
		}
		return Registros;
	}
	
	public List<Registros> obterRegistrosRelatorio(int idFuncionario) throws SQLException {

		List<Registros> Registros = new ArrayList<Registros>();
		
		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			String sql = "select id_registro, TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG, FUNCIONARIO_id_funcionario_func, tipo_registro.st_nome_treg, funcionarios.st_nome_func, dt_horario_reg, dt_dia_reg from registros inner join tipo_registro on(registros.TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG = tipo_registro.id_tipo_registro_treg) inner join funcionarios on (registros.FUNCIONARIO_id_funcionario_func = funcionarios.id_funcionario_func) where funcionario_id_funcionario_func = "+idFuncionario+" order by id_registro desc;" ;
			rs = st.executeQuery(sql);
			while (rs.next()) {
				Registros result = new Registros();
				result.setIdRegistro(rs.getInt("ID_REGISTRO"));
				result.setIdTipoRegistro(rs.getInt("TIPO_REGISTRO_ID_TIPO_REGISTRO_TREG"));
				result.setData(rs.getString("DT_DIA_REG"));
				result.setHora(rs.getString("DT_HORARIO_REG"));
				result.setIdFuncionario(rs.getInt("FUNCIONARIO_id_funcionario_func"));
				result.setNomeTipoRegisto(rs.getString("tipo_registro.st_nome_treg"));
				result.setNomeFuncionario(rs.getString("funcionarios.st_nome_func"));

				Registros.add(result);
			}
		} finally {
			st.close();
			rs.close();
		}
		return Registros;
	}
}
